/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package c;

import clases.TipoValidaciones;
import java.util.ArrayList;
import java.util.HashMap;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.postgresql.jdbc2.EscapedFunctions;

public class Controller {

    private String sqlInsert;
    private String sqlUpdate;
    private String sqlCount;
    private ArrayList allowUpdate = new ArrayList();

    // Metodo que permite validar elementos
    protected HashMap validar(HashMap validaciones) {
        TipoValidaciones tipoValidaciones = new TipoValidaciones();
        return validaciones;
    }
    // Imprimir rapidamente un Srring

    protected void i(String e) {
        System.out.println(e);
    }

    String sqlAndValidation(String tabla, StringBuilder sqlAndRestricciones, String mod, String campoPK) {

        String r = "";
        String tablaBD = tabla;
        StringBuilder camposBD = new StringBuilder();
        StringBuilder valoresBD = new StringBuilder();
        StringBuilder infoUnq = new StringBuilder();
        StringBuilder camposUpdate = new StringBuilder();
        String[] campo = sqlAndRestricciones.toString().split("&");

        String resultValidacion = "";

        for (int i = 0; i < campo.length; i++) {

            String infoCampo = campo[i];
            String encabezadoMsj = (infoCampo.startsWith("@")) ? "" : infoCampo.substring(0, infoCampo.indexOf("@"));
            String campobd = infoCampo.substring(infoCampo.indexOf("@") + 1, infoCampo.indexOf("="));
            String valor = infoCampo.substring(infoCampo.indexOf("=") + 1, infoCampo.lastIndexOf("[")).trim();
            Boolean req = (infoCampo.indexOf("req") != -1) ? true : false;
            String tValidacion = infoCampo.substring(infoCampo.lastIndexOf("-") + 1, infoCampo.lastIndexOf("("));
            String vMin = infoCampo.substring(infoCampo.lastIndexOf("(") + 1, infoCampo.lastIndexOf(","));
            String vMax = infoCampo.substring(infoCampo.lastIndexOf(",") + 1, infoCampo.lastIndexOf(")"));
            Boolean unq = (infoCampo.contains("UNQ")) ? true : false;



            resultValidacion = executeValidation(req, valor, tValidacion, vMin, vMax, encabezadoMsj);

            if (!resultValidacion.isEmpty()) {
                //System.out.println("validacion " + resultValidacion);
                r = resultValidacion;
                break;
            } else {
                //System.out.println("Validacion OK!");
            }


            //Omitir campos que esten vacios en el SQL (principalmente los que no lleven '' ) ;)
            if (!valor.isEmpty()) {

                // si es un numero eliminar espacios.
                if (!valor.contains("'") && valor.contains(" ")) {
                    valor = valor.replaceAll(" ", "");
                }

                if (mod.equals("INSERT")) {
                    camposBD.append(campobd).append(",");
                    valoresBD.append(valor).append(",");
                } else if (mod.equals("UPDATE")) {
                    camposUpdate.append(campobd).append(" = ").append(valor).append(" , ");
                }

                if (unq) {
                    infoUnq.append(campobd).append(" = ").append(valor).append(" OR ");
                    String valorAnterior = infoCampo.substring(infoCampo.lastIndexOf(")") + 4, infoCampo.lastIndexOf("]"));
                    System.out.println(String.format("valor (%s) = valorAnterior(%s)", valor.replace("'", "") , valorAnterior.replace("'", "")));
                    allowUpdate.add(valor.replace("'", "").equals(valorAnterior.replace("'", "")));
                }
            }



            //Llamar Aqui Validacion Campo a Campo

//            System.out.println("------------------------------");
//            System.out.println("encabezadoMsj |" + encabezadoMsj + "|");
//            System.out.println("campobd |" + campobd + "|");
//            System.out.println("valor |" + valor + "|");
//            System.out.println("req? |" + req + "|");
//            System.out.println("tValidacion |" + tValidacion + "|");
//            System.out.println("vMin |" + vMin + "|");
//            System.out.println("vMax |" + vMax + "|");
//            System.out.println("------------------------------");
        }

        if (resultValidacion.isEmpty()) {

            if (mod.equals("INSERT")) {
                setSqlInsert("INSERT INTO " + tablaBD + "(" + camposBD.substring(0, camposBD.length() - 1) + ") VALUES(" + valoresBD.substring(0, valoresBD.length() - 1) + ")");
            } else if (mod.equals("UPDATE")) {
                setSqlUpdate("UPDATE " + tablaBD + " SET " + camposUpdate.substring(0, camposUpdate.length() - 2) + " WHERE " + campoPK);
                System.out.println("getSqlUpdate() = " + getSqlUpdate());
            }
            //System.out.println(getSqlInsert());

            System.out.println("Unico : " + infoUnq.length());

            if (infoUnq.length() != 0) {
                setSqlCount(tablaBD, infoUnq);
                System.out.println("SQL COUNT |" + getSqlCount());
            }

        }
        return r;
    }

    /**
     * Ejecuta la Validacion del Campo <br> --- Hay que mejorar el rendimiento &
     * redundancia u_u ---
     *
     * @author : gaso
     * @date : 01/03/2012
     *
     * @param req
     * @param valor
     * @param tValidacion
     * @param vMin
     * @param vMax
     * @param encabezadoMsj
     * @return
     */
    private String executeValidation(Boolean req, String valor, String tValidacion, String vMin, String vMax, String encabezadoMsj) {

        TipoValidaciones tV = new TipoValidaciones();

        String respuesta = "";
        String mensaje = "";
        String eval = valor.replaceAll("'", "");

        // ===> Validacion Vacio
        if (respuesta.isEmpty()) {

            if (req) {
                if (tV.es_vacio(eval)) {
                    respuesta = "error";
                    mensaje = "[¡Campo Vacio! - Ingrese la Información solicitada] " + encabezadoMsj + ": es Requerido.";
                }
            }

        }


        // ===> Validacion Numeros-Letras , etc
        if (respuesta.isEmpty()) {
            System.out.println("es requerido : |" + req);
            System.out.println("es vacio : |" + tV.es_vacio(eval));
            if (!tV.es_vacio(eval)) {
                if (tValidacion.equals("num")) {
                    if (!tV.es_num(eval)) {
                        respuesta = "error";
                        mensaje = "[¡El Campo contiene caracteres no admitidos] " + encabezadoMsj + ": Solo se permiten Numeros.";
                        System.out.println("Validando Numerossssss (" + eval + ")");
                    }

                } else if (tValidacion.equals("txt")) {
                    if (!tV.es_alfaBetico(eval)) {
                        respuesta = "error";
                        mensaje = "[¡El Campo contiene caracteres no admitidos] " + encabezadoMsj + ": Solo se permiten Letras.";
                    }
                } else if (tValidacion.equals("fecha")) {
                    if (!eval.equals("null")) {
                        if (!tV.es_fecha(eval)) {
                            respuesta = "error";
                            mensaje = "[¡El Campo no tiene una Fecha Valida] " + encabezadoMsj + ": Formato de Fecha Invalida.";
                        }
                    }
                }else if (tValidacion.equals("mail")) {
                    if (!eval.equals("null")) {
                        if (!tV.es_email(eval)) {
                            respuesta = "error";
                            mensaje = "[¡El Campo no tiene una Correo Electronico Valido] " + encabezadoMsj + ": Email invalido.";
                        }
                    }
                }
            }
        }


        // ===> Validacion Si el Valor es Menor
        if (respuesta.isEmpty()) {
            if (!req && !tV.es_vacio(eval)) {
                if (tV.es_menor(eval, vMin)) {
                    respuesta = "error";
                    mensaje = "[Campo con Longitud Minima] " + encabezadoMsj + ": El Campo requiere como minimo(" + vMin + ") caracteres.";
                }
            }
        }


        // ===> Validacion Si el Valor es Mayor
        if (respuesta.isEmpty()) {
            if (tV.es_mayor(eval, vMax)) {
                respuesta = "error";
                mensaje = "[El Valor introducido es mayor a lo Permitido ] " + encabezadoMsj + ": El Campo permite maximo(" + vMax + ") Caracteres.";
            }
        }

        return respuesta + mensaje;

    }

    public String getSqlInsert() {
        return sqlInsert;
    }

    public void setSqlInsert(String sqlInsert) {
        this.sqlInsert = sqlInsert;
    }

    public String getSqlUpdate() {
        return sqlUpdate;
    }

    public void setSqlUpdate(String sqlUpdate) {
        this.sqlUpdate = sqlUpdate;
    }

    public String getSqlCount() {
        return sqlCount;
    }

    public void setSqlCount(String tabla, StringBuilder infoUnq) {
//        String[] campo =  camposbd.toString().substring(0, camposbd.length() - 1).split(","); //camposbd.split(",");
//        String[] valor = valores.toString().substring(0, valores.length() - 1).split(",");
        String whereSql = infoUnq.substring(0, infoUnq.length() - 4);
//        
//        for (int i = 0; i < campo.length; i++) {
//            whereSql += " "+campo[i]+" = " + valor[i] + " AND ";
//        }


        this.sqlCount = "SELECT COUNT(*) FROM " + tabla + " WHERE " + whereSql;
    }

    public Boolean allowUpdate() {
        return (allowUpdate.contains(false)) ? false : true;
    }
    
    public void resetAllowUpdate(){
        allowUpdate = new ArrayList();
    }
}
